package cn.sunxyz.jdbc;

import org.junit.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * Created by yangrd on 2017/5/31.
 */
public class JdbcBatchHandleByPrepareStatement {


    /**
     * 采用PreparedStatement.addBatch()实现批处理
     * 　　　　优点：发送的是预编译后的SQL语句，执行效率高。
     * 　　　　缺点：只能应用在SQL语句相同，但参数不同的批处理中。因此此种形式的批处理经常用于在同一个表中批量插入数据，或批量更新表的数据。
     */
    @Test
    public void testJdbcBatchHandleByPrepareStatement() {
        long starttime = System.currentTimeMillis();
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();
            String sql = "insert into testbatch(id,name) values(?,?)";
            st = conn.prepareStatement(sql);
            for (int i = 0; i < 100000; i++) {  //i=1000  2000
                st.setInt(1, i);
                st.setString(2, "aa" + i);
                st.addBatch();
                if (i % 1000 == 0) {
                    st.executeBatch();
                    st.clearBatch();
                }
            }
            st.executeBatch();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn, st, rs);
        }
        long endtime = System.currentTimeMillis();
        System.out.println("程序花费时间：" + (endtime - starttime) / 1000 + "秒！！");
    }
}
